Eglot: better fix for bug#70724
authorJoão Távora <joaotavora@gmail.com>
Thu, 6 Jun 2024 22:08:28 +0000 (17:08 -0500)
committerJoão Távora <joaotavora@gmail.com>
Thu, 6 Jun 2024 22:13:57 +0000 (17:13 -0500)
If the project's root is or destroyed , this may happen for a
variety of reasons, including reasons affecting non-reconnection
scenarios, so better to check in eglot--connect.

An Eglot "reconnection" has always created as accurate a copy of
the previous server object as possible, down to the 'eq'ness or
the saved initargs, language ids, etc.  So re-querying for
projects is not the thing to do here.

A new different server can be created with `M-x eglot` which will
ask about shutting down the existing one.

* lisp/progmodes/eglot.el (eglot-reconnect):  Revert previous change.
(eglot--connect):  Do sanity check here

lisp/progmodes/eglot.el

index f58a895a3f124b95d4ae3d798c4b9e28a84480d7..03da5c7b22af0b6b3fa5feeed44b96c6b7da1a7e 100644 (file)
@@ -1419,15 +1419,11 @@ INTERACTIVE is t if called interactively."
   (interactive (list (eglot--current-server-or-lose) t))
   (when (jsonrpc-running-p server)
     (ignore-errors (eglot-shutdown server interactive nil 'preserve-buffers)))
-  (let* ((default-directory (project-root (eglot--project server)))
-         (project (eglot--current-project)))
-    (if (not project)
-        (eglot--error "Project in `%s' is gone!" default-directory)
-      (eglot--connect (eglot--major-modes server)
-                      project
-                      (eieio-object-class-name server)
-                      (eglot--saved-initargs server)
-                      (eglot--language-ids server))))
+  (eglot--connect (eglot--major-modes server)
+                  (eglot--project server)
+                  (eieio-object-class-name server)
+                  (eglot--saved-initargs server)
+                  (eglot--language-ids server))
   (eglot--message "Reconnected!"))
 
 (defvar eglot--managed-mode) ; forward decl
@@ -1518,7 +1514,12 @@ Each function is passed the server as an argument")
 This docstring appeases checkdoc, that's all."
   (let* ((default-directory (project-root project))
          (nickname (project-name project))
-         (readable-name (format "EGLOT (%s/%s)" nickname managed-modes))
+         (readable-name
+          (progn
+            (unless (file-exists-p default-directory)
+              ;; could happen because of bug#70724 or just because
+              (eglot--error "Project '%s' is gone!" nickname))
+            (format "EGLOT (%s/%s)" nickname managed-modes)))
          server-info
          (contact (if (functionp contact) (funcall contact) contact))
          (initargs